import pandas as pd
import matplotlib.pyplot as plt
import numpy as np


# 从数据库读取数据
query = "SELECT * FROM students"
df_students = pd.read_sql(query, engine)

# 显示所有列
pd.set_option('display.max_columns', None)
show_ip_interface_brief=pd.read_csv('show ip interface brief.csv')

# 数据分析：计算平均分
average_score = df_students['score'].mean()
print(f"平均分：{average_score}")
df_students['score'].describe([0.2,0.3,0.5,0.8])

#计算两列数据之间的相关性
# 协方差：绝对值越大，线性关系越强
data['tx_bytes'].cov(data['rx_bytes'])
# 相关系数：相关系数在-1到1之间，接近1为正相关，接近-1为负相关，0为不相关。
data['tx_bytes'].corr(data['rx_bytes'])

print(stats.skew(X))  # 计算偏度
print(stats.kurtosis(X))  # 计算峰度

# df=df[df['A'].isin([45,60])]
# 多条件判断
# df=df[(df['IP-Address']!='unassigned')&(df['Admin']=='down')]



##################################################################################
##################################################################################

#多文件处理
file_name=os.listdir(base_dir) #获取base_dir目录下的所有文件
command_result_all=pd.DataFrame()
for x in file_name:
    path_final=os.path.join(base_dir,x)
    file=pd.read_csv(path_final)



##################################################################################
##################################################################################
show_ip_interface_brief=pd.read_csv('show ip interface brief.csv')
data=show_ip_interface_brief

# groupby中的关键参数：
# as_index：是否将分组键作为索引返回。如果 as_index=True（默认值），则返回一个带有分组键作为索引的对象；否则返回一个不带索引的对象。
# sort：是否对分组键进行排序。如果 sort=True（默认值），则对分组键进行排序；否则不排序。
# dropna：是否删除包含缺失值的行。如果 dropna=True（默认值），则删除包含缺失值的行；否则保留。


#计算，求mean, count, unique, sum
#as_index参数可以控制是否需要将Admin列作为新的index，效果类似于df.reset_index()
data_1=data.groupby(['Admin'], as_index=False)['IP-Address'].count()

# .agg操作 可以取多个函数进行选择 有时候我们既需要平均值，有需要计数(也可是取一个
#as_index针对agg操作，不起作用
data_2=data.groupby(['Admin'], as_index=False)['IP-Address'].agg(['count'])

#传入字典，对不同的字段进行不同的计算
data_3=data.groupby('race', as_index=False).agg({'age':np.median,'signs of mental':np.mean})

#根据接口Admin状态，分类获取，up的接口列表，down的接口列表
#unique函数不可以用as_index
data_4=data.groupby('Admin')['IP-Address'].unique()
data_4=data_4.reset_index()

#对 A 列进行分组，并将每组中 C 列的值用分号隔开。
#效果类似unique()
data_5=data.groupby('Admin',as_index=False).agg({'IP-Address': lambda x: ';'.join(x)})


# 使用 transform() 创建新列
#新增列名为avg_sales
df['avg_sales'] = df.groupby('name')['sales'].transform('mean')
# 我们创建了一个新列 ‘avg_sales’，它包含每个人的平均销售额。
# transform('mean') 计算每个分组的平均值，并将结果广播到原始 DataFrame 的每一行。




##################################################################################
##################################################################################
#pd.concat之后，索引顺序由问题，需要重置index，把原来的索引index列去掉，
output_ip_interface=output_ip_interface.reset_index(drop=True)

#替换
data.replace({1:5，'one':'ONE'}) # 使用字典指定替换关系

#重新设置columns
df1 = df.reindex(columns=list(df.columns))

#缺失值处理
df1 = df.reindex(columns=list(df.columns+['G'])) #重新设置columns新增一列G，数值均为na
df1['G'].fillna(5,inplace=True)#使用指定值原地填充缺失值
data.dropna(axis=0, how='any', inplace=True)

#对于重复的数据，只保留最后一个
data.drop_duplicates(['k1'],keep='last')
data = pd.DataFrame({'k1':['one']* 3 +['two']*4,
'k2':[1,1,2,3,3,4,4]})

#求差分
data['rx_bytes'] = data['rx_bytes'].diff(1)


####################################################################
#二维数组的映射
#使用函数进行映射
data['k1']= data['k1'].map(str.upper)

#使用字典表示映射关系
data['k1'] = data['k1'].map({'ONE':'one', 'TWO':'two'})


#日期序列生成
timedelta = data['datetime'][1] - data['datetime'][0]
predict_end_time = pd.to_datetime(end_time) + timedelta * parameter['predict_lens']
freq = str(int(timedelta.seconds / 60)) + 'min'
date_range = pd.date_range(start=end_time, end=predict_end_time, freq=freq)[1:]
plt.xticks(date_range, rotation=30)  # 设置时间标签显示格式



